package com.xinggq.pay.service.pay.channel.yse.other.division.dto;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.xinggq.pay.service.entity.YsePayConfigEntity;
import com.xinggq.pay.service.pay.channel.yse.enums.YseBusinessDic;
import com.xinggq.pay.service.pay.channel.yse.enums.YseMethodEnum;
import com.xinggq.pay.service.pay.channel.yse.utils.YseUtil;
import java.math.BigDecimal;
import lombok.Data;

/**
 * 分账公共请求参数
 *
 * @author qth
 * @since 2023/10/26 17:33 */
@Data
public class DivisionReqDTO {

  /**
   * 接口名称
   */
  @JsonProperty("method")
  public String method;
  /**
   * 在银盛支付开设的服务商商户号，请联系客户经理提供
   */
  @JsonProperty("partner_id")
  private String partnerId;
  /**
   * 发送请求的时间，格式"yyyy-MM-dd HH:mm:ss" 示例值：2014-07-24 03:07:50
   */
  @JsonProperty("timestamp")
  private String timestamp;
  /**
   * 商户网站使用的编码格式，如UTF-8、GBK、GB2312等，默认值 GBK
   */
  @JsonProperty("charset")
  private String charset;
  /**
   * 报文签名算法，RSA/SM
   */
  @JsonProperty("sign_type")
  private String signType;
  /**
   * 签名字符串，再用Base64编码
   */
  @JsonProperty("sign")
  private String sign;
  /**
   * 银盛支付服务器主动通知商户网站里指定的页面http路径。
   */
  @JsonProperty("notify_url")
  private String notifyUrl;
  /**
   * 接口版本3.0 当前版本：3.0
   */
  @JsonProperty("version")
  private String version;
  /**
   * 业务请求参数的集合，最大长度不限，除公共参数外所有请求参数都必须放在这个参数中传递
   */
  @JsonProperty("biz_content")
  private String bizContent;


  @Data
  public static class DivisionCheckInDTO {

    /**
     *商户系统生成的订单号
     */
    @JsonProperty("out_trade_no")
    private String outTradeNo;
    /**
     *主商户号（原交易收款方）
     */
    @JsonProperty("payee_usercode")
    private String payeeUsercode;
    /**
     *原订单交易金额，20长度位，保留2位小数
     */
    @JsonProperty("total_amount")
    private BigDecimal totalAmount;
    /**
     *原订单是否参与分账01：是，02否
     */
    @JsonProperty("is_divistion")
    private String isDivistion;
    /**
     *是否重新分账Y：是，N：否
     */
    @JsonProperty("is_again_division")
    private String isAgainDivision;
    /**
     *分账模式01 ：比例，02：金额
     */
    @JsonProperty("division_mode")
    private String divisionMode;
  }

  public static DivisionReqDTO buildDivisionPublicRequestDTO(DivisionParamDTO payParamDto,
      YsePayConfigEntity ysePayConfig) {
    DivisionCheckInDTO businessParam = new DivisionCheckInDTO();
    businessParam.setOutTradeNo(payParamDto.getChannelOutTradeNo());
    businessParam.setPayeeUsercode(ysePayConfig.getSellerId());
    businessParam.setTotalAmount(payParamDto.getTotalAmount());
    businessParam.setIsDivistion(YseBusinessDic.IsDivision.NO);
    businessParam.setIsAgainDivision(YseBusinessDic.IsAgainDivision.NO);
    businessParam.setDivisionMode(YseBusinessDic.DivisionMode.MONEY);

    DivisionReqDTO publicParam = new DivisionReqDTO();
    publicParam.setMethod(YseMethodEnum.DIVISION.getMethod());
    publicParam.setPartnerId(ysePayConfig.getPartnerId());
    publicParam.setTimestamp(DateUtil.now());
    publicParam.setCharset("UTF-8");
    publicParam.setSignType("RSA");
    publicParam.setNotifyUrl(ysePayConfig.getNotifyUrl());
    publicParam.setVersion(YseMethodEnum.DIVISION.getVersion());
    publicParam.setBizContent(JSONUtil.toJsonStr(BeanUtil.beanToMap(businessParam, true, true)));
    publicParam.setSign(YseUtil.generateSign(publicParam, publicParam.getCharset()));
    return publicParam;
  }
}
